package QianFeng07.IODemo.ByteAndCharStream;

import java.io.*;

/**
 * 字节输出输入流
 * 输出流：超类OutputStream，对文件的输出流使用子类FileOutputStream
 * 输出入：超类InputStream，对文件的输入流使用子类FileInputStream
 *
 * 输入输出字节流操作原理，每次只会操作一个字节   （从文件中读取或写入）
 * 字节操作流，默认每次执行写入操作会直接把数据写入到文件中
**/
public class ByteStreamDemo {
    public static void main(String[] args) {
        out();
        in();
    }

    //输入流
    private static void in() {
        //1.确定目标文件
        File file = new File("F:\\Test\\Test.txt");
        try {
            //2.构建一个文件输入对象
            InputStream inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];//中文占两个字节，用奇数会产生乱码比如byte[3]   用字符流可以解决
            StringBuilder stringBuilder = new StringBuilder();
            int len = -1;//表示每次读取的字节长度
            //3.把数据读入到数组中，并返回读取的字节数，当不等于-1时，表示读取到数据，等于-1表示文件以及读取完毕
            while ((len = inputStream.read(bytes)) != -1) {
                //根据读取到的字节数组，再转换为字符串内容，添加到StringBuilder中
                stringBuilder.append(new String(bytes, 0, len));
            }
            //关闭输入流
            inputStream.close();
            System.out.println(stringBuilder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //输出流
    private static void out() {
        //1.确定目标文件
        File file = new File("F:\\Test\\Test.txt");
        try {
            //2.构建一个文件输出对象
            OutputStream outputStream = new FileOutputStream(file, true); //append 为原来的文件中追加内容，去掉则是覆盖
            //3.输出的内容
            String info = "十年生死两茫茫\r\n"; //  \r\n 换行
            //String line = System.getProperty("line.separator");//获取换行符  "十年生死两茫茫line"同样可以换行
            //4.把内容写入文件中
            outputStream.write(info.getBytes());//没有缓存，直接写入文件中
            //5.关闭流
            outputStream.close();
            System.out.println("write success!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
